﻿package com.jyhg.core.common.utils
{
	
	/**
	 *屏幕震动 
	 * @author Jonny
	 * 
	 */	
	public class EffectShake
	{
		//静态存储
		public static var _shake:Array = [];
		/**
		 *更新屏幕震动 
		 * 
		 */
		public static function update():void
		{
			var index:Number
			for(index = _shake.length - 1; index >= 0; index--)
			{
				shake(index);
			}
		}
		/**
		 * 
		 * @param cont			容器
		 * @param xspeed		x速度
		 * @param yspeed		y速度
		 * @param xsteps		x方向震动次数
		 * @param ysteps		y方向震动次数[NaN为与X值像等]
		 * @param addTheLast	追加到末尾[否则删除优先级低的,替换优先级高的]
		 * 
		 */
		public static function addShake(cont:*, xspeed:Number, yspeed:Number, xsteps:Number, ysteps:Number = NaN, addTheLast:Boolean = false):void
		{
 			if(null != cont)
			{
				var index:Number = ArrayObject.isIndex(_shake, cont, 0);
				if(-1 == index)
				{
					//震动屏幕放置
					_shake.push([cont, [xspeed, yspeed, xsteps, ysteps]]);
				} else {
					//是否追加到末尾
					if(addTheLast)
					{
						//追加到末尾
						_shake[index].push([xspeed, yspeed, xsteps, ysteps]);
					} else {
						//比较是否要替换(如果现在的震屏 小于我将要的震动屏幕)
						if(_shake[index][1][0] + _shake[index][1][1] <= xspeed + yspeed)
						{
							_shake[index][1] = [xspeed, yspeed, xsteps, ysteps];
						}
					}
				}
			}
		}
		
		/**
		 *清除索引中的震动屏幕 
		 * 并将屏幕恢复成0， 0
		 * @param index
		 * 
		 */
		private static function removeIndex(index:Number):void
		{
			_shake[index].splice(1, 1);
			//恢复容器 0, 0
			_shake[index][0].x = _shake[index][0].y = 0;
			//如果长度是小于等于1的
			if(_shake[index].length <= 1)
				_shake.splice(index, 1);
		}
		/**
		 *震动屏幕 
		 * @param value
		 * 
		 */
		private static function shake(index:Number):void
		{
			var value:Array = _shake[index];
			var spt:* = value[0];
			var data:Array = value[1];
			var isShake:Boolean;
			//左右屏幕递减且震动
			if(!isNaN(data[2]) && data[2] > 0)
			{
				if(spt.x != 0)
					spt.x = 0;
				else
					spt.x = NumberObject.random(1,-1) * data[0];
				
				data[2]--;
				isShake = true;
			}
			if(!isNaN(data[3]) && data[3] > 0)
			{
				if(spt.y != 0)
					spt.y = 0;
				else
					spt.y = NumberObject.random(1,-1) * data[1];
				data[3]--;
				isShake = true;
			}
			//左右屏幕震动
			if(!isShake)
				removeIndex(index);
			
			
		}
		
		
		
		/**
		 *删除自己 [删除前将移位的修正回来]
		 * 
		 */
		public static function deleteMe():void
		{
			var index:Number
			for(index = _shake.length - 1; index >= 0; index--)
			{
				_shake[index].splice(2);
				removeIndex(index);
			}
		}
	}
}